﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using ComunesMGI.Enum;
using MGI.AccesoDatos;
using ComunesMGI.Constantes;
using System.IO;

namespace MGI.Logica
{
    class MgrIncidentes
    {

        #region Singleton

        /// <summary>
        /// implementación de singleton para el manejador de incidentes
        /// </summary>
        static private MgrIncidentes _instance;

        /// <summary>
        /// implementación de singleton para el manejador de incidentes
        /// retorna una instancia del manejador
        /// </summary>
        /// <returns>MgrIncidentes</returns>
        static public MgrIncidentes GetInstance()
        {
            if (_instance == null)
            {
                _instance = new MgrIncidentes();
            }
            return _instance;
        }

        #endregion

        public List<DataCampo> GetCampos(string nomCliente, DataSistema dataSistema,Lista lista)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.GetIDatosIncidentes();
            List<DataCampo> nomCampos = datosIncidentes.GetCampos(nomCliente, dataSistema.Nombre, lista);

            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.GetCampos( dataSistema.Sitio, lista, nomCampos);
        }

        public DataAltaIncidente AddIncidente(DataSistema incidente)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.AddIncidente(incidente);
        }

        
        public List<DataIncidente> GetIncidentes(String sitioSistema)
        {
            
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.GetIncidentes(sitioSistema);
        }

        public List<DataTarea> GetTareas(string sitio, int idIncidente)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();

            return sharepoint.GetTareas(sitio, idIncidente);
        }

        public string AsignarResponsable(string sitio, int idIncidente, int idTarea, DataUsuario usuario)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            string mail = sharepoint.AsignarResponsable(sitio, idIncidente, idTarea, usuario);
            return mail;
        }

        public void AddWorkPackage(int idSistema, DataWP workPackage)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosWorkPackages datosWP = accesoDatos.GetIDatosWorkPackages();
            datosWP.AddWorkPackage(idSistema, workPackage);
        
        }

       
        public List<DataWP> GetWorkPackages(int sisCod)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosWorkPackages datosWP = accesoDatos.GetIDatosWorkPackages();
            return datosWP.GetWorkPackages(sisCod);
        }

        public void AsociarIncidentesWP(string sitioSistema, int idWorkPackage, List<int> incidentes)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            
            foreach (int idIncidente in incidentes)
            {
                sharepoint.SetIncidenteWP(sitioSistema, idWorkPackage, idIncidente);
            }
        }

        public List<DataIncidenteReporte> GetIncidentesCerradosPeriodo(List<DataSistema> sistemas, DateTime perFchIni, DateTime perFchFin)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.GetIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            List<DataIncidenteReporte> incidentes = new List<DataIncidenteReporte>();
            List<DataIncidenteReporte> incidentesSistema;
            foreach (DataSistema dataSistema in sistemas)
            {
                incidentesSistema = sharepoint.GetIncidentesReporte(dataSistema);
                foreach (DataIncidenteReporte incidenteAnalizado in incidentesSistema)
                {
                    //incidenteAnalizado.FechaCierre = DateTime.Today;
                    if (incidenteAnalizado.FechaCierre != ConstantesMGI.FechaVacia)
                    {
                        if (incidenteAnalizado.FechaCierre.CompareTo(perFchFin) <= 0 &&
                            incidenteAnalizado.FechaCierre.CompareTo(perFchIni) >= 0) 
                        {
                            incidentes.Add(incidenteAnalizado);                
                        }
                    }
                }
                
            }
            return incidentes;
        }

      
        public string UploadFile(Stream sourceStream) 
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.GetIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.UploadFile(sourceStream);
        }

        public List<DataIncidente> GetIncidentesWP( string sitioSistema, int idWorkPackage) 
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();

            return sharepoint.GetIncidentesWP( sitioSistema, idWorkPackage);
        }

        public bool AdjuntarArchivoIncidente(string nombreArchivo, string urlSistema, int idIncidente, string nroTemp)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.GetIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.AdjuntarArchivoIncidente(nombreArchivo, urlSistema, idIncidente, nroTemp);
        }


        public List<DataEstadoWP> GetEstadosWP()
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            IDatosWorkPackages datosWP = accesoDatos.GetIDatosWorkPackages();
            return datosWP.GetEstadosWP();
        }


        public DataAltaTarea AddTarea(string urlSistema, int idIncidente, List<DataCampo> campos)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();
            return sharepoint.AddTarea(urlSistema, idIncidente,campos);
        }

        public List<DataIncidenteReporte> VisualizarIncidentesAsignados(DataSistema  sistema, string usuario, DateTime perFchIni, DateTime perFchFin) 
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.GetInstance();
            ISharepoint sharepoint = accesoDatos.GetISharepoint();

            List<DataIncidenteReporte> incidentes = new List<DataIncidenteReporte>();
            List<DataIncidenteReporte> incidentesSistema;
            incidentesSistema = sharepoint.GetIncidentesReporte(sistema);
            foreach (DataIncidenteReporte incidenteAnalizado in incidentesSistema)
            {
                //incidenteAnalizado.FechaCierre = DateTime.Today;
                if (incidenteAnalizado.FechaPropuesto.CompareTo(ConstantesMGI.FechaVacia) != 0)
                {
                    if (incidenteAnalizado.FechaPropuesto.CompareTo(perFchFin) <= 0 &&
                        incidenteAnalizado.FechaPropuesto.CompareTo(perFchIni) >= 0)
                    {
                        //pasa a minuscula ambos y los compara
                        if (incidenteAnalizado.Responsable != null)
                        {
                            if (incidenteAnalizado.Responsable.ToLower().CompareTo(usuario.ToLower()) == 0)
                            {
                                incidentes.Add(incidenteAnalizado);
                            }
                        }
                        
                    }
                }
            }


            return incidentes;
        }

    }
}
